Sophos SAVDIでウイルス検索をしてみた
はじめに
Sophos SAV Dynamic Interface (SAVDI) をご紹介します。
SAVDIはファイルをアップロードするようなシステムと相性の良いウイルスチェック用APIです。
ファイルアップローダー
ファイルアップローダーについて考えます。
ユーザがWEB画面からファイルを指定すると、EC2を経由してs3にファイルをPUTします。
悪意のあるファイルをアップロードされないために何が出来るでしょうか。
Anti-Virusでの検査
ファイルの検査といえば、アンチウイルスソフトが思い浮かびます。
Sophos Anti-Virusを使って、検査する方法を考えます。
一般的にアンチウイルスソフトには、オンアクセス検索とオンデマンド検索があります。
オンアクセス検索
オンアクセスで検査する場合、ファイルをアップロードするとリアルタイムで検査が実行されます。
欠点として、検査結果による処理分岐が難しいです。
SAVDIでは検査結果を戻り値で判断し、アプリケーションの処理分岐に役立てる事が出来ます。
オンデマンド検索
ファイルアップロード時にsavscanコマンドを実行します。
欠点として、検査ごとに定義ファイルを読み込むためタイムロスが大きくなります。
SAVDIではデーモン/サービスが常駐するため、高速なスキャンが可能です。
SAVDIでのウイルスチェック
SAVDIはデーモンとして常駐します。
アプリケーションは、ソケットベースのインターフェースを通してデーモンと通信します。
検査結果によってデーモンからの戻り値が異なるためアプリケーション側で処理分岐を簡単に行う事ができます。
アプリケーションの言語は、特に制限はありません。
SAVDIと通信ができればOKです。
正常なファイルのアップロード時
ユーザーがファイルをアップロードすると、アプリケーションはSAVDIに検索を依頼します。
SAVDIの戻り値からファイルが正常であると判断出来る場合はs3にPUTします。
ウイルスアップロード時
SAVDIに検索を依頼する所までは同じです。
SAVDIの戻り値からファイルが異常であると判断した場合は、エラーメッセージを表示します。
アプリケーションでファイルを削除することも可能です。
SAVDIのセットアップ
Antivirus for Linuxのインストール
SAVDIを利用するには、Antivirusが必要です。
Amazon Linuxに Sophos Antivirus for Linuxをインストールしました。
検証に利用したバージョンは、9.12.1です。
SAVDIのインストール
tarファイルを展開し、インストーラを実行します。
$ tar xvf savdi-23-linux-64bit.tar $ cd savdi-install/ $ sudo ./savdi_install.sh
検証時のバージョンは 2.3.0です。
$ savdid -V SAV Dynamic Interface 2.3.0 Copyright 2000-2015 Sophos Limited. All rights reserved $
起動
SAVDIを起動します。
$ savdid -c /usr/local/savdi/savdid.conf $ ps -ef | grep savdi root 3523 3416 0 01:32 pts/0 00:00:04 savdid -c /usr/local/savdi/savdid.conf
スクリプトの実行
pythonとSAVDIで検索を行うスクリプトを作成しました。
正常なファイルの検索
引数に検索対象を指定し実行します。
$ python sssp_name.py /var/log/messages OK (0000) The function call succeeded $
EICARファイルの検索
アンチウイルスの応答をテストできるEICARファイルを指定すると、検知されます。
$ python sssp_name.py /tmp/eicar Virus: EICAR-AV-Test in /tmp/eicar OK (0203) Virus found during virus scan $
SAVDI停止時の挙動
SAVDIが停止している時に実行すると、検索出来ません。
$ python sssp_name.py /var/log/messages Can't connect $
WEBページの作成
簡易的なファイルアップローダーを作ってみました。
httpdのインストール
$ yum install -y httpd $ vi /etc/httpd/conf/httpd.conf 先頭のシャープを削除 -------- AddHandler cgi-script .cgi -------- $ service httpd start
画像一時配置ディレクトリの作成
$ mkdir /var/www/tmp $ chown apache:apache tmp/
アップローダの配置
$ tree /var/www/ -I 'error|icons' /var/www/ ├── cgi-bin │ ├── sssp_name.py │ ├── sssp_utils.py │ └── upload.cgi ├── html │ └── index.html └── tmp
それぞれのコードは以下に配置しました。
s3アップローダ
トップページはこんな感じです。
index.htmlでファイルを選択し、送信するとupload.cgi
が呼び出されます。
upload.cgi内でsssp_name.py
を呼び出します。
sssp_name.py
はSAVDIと通信し検索を行います。
通常のテキストファイルをアップロードすると、検索後にs3にアップロードします。
AWSマネージドコンソールからs3バケットを見ると、ファイルがアップロードされたことがわかります。
EICARファイルをアップロードすると、エラーメッセージを表示します。
s3バケットへのアップロードは行いません。
終わりに
Sophos SAV Dynamic Interface (SAVDI) を紹介しました。
SAVDIはファイルをアップロードするようなシステムと相性の良いウイルスチェック用APIです。
デーモン/サービスが常駐するため、高速なスキャンが可能です。
また、検索結果に応じてアプリケーションの処理を分岐できます。
ファイルをアップロードし何かしらの処理を与えるようなアプリケーションを作成する場合、Fitすると思います。